"""
当我们登录的时候,我们需要将cookie数据合并到redis中

cookie : {sku_id:{count:xxx,selected:xxx}}

redis  : hash  {sku_id:count}
         set   {sku_id,sku_id}

把抽象的事物具体化
1.获取cookie数据
cookie  : {1:{count:2,selected:True},2:{count:3,selected:True}}

2.获取redis数据 (只获取hash数据)
    选中的id我们用一个容器单独去记录
redis  : hash  {2:10,3:122}
         set   {3}
3.合并
分析,cookie数据和redis数据合并的业务逻辑
    cookie数据是 sku_id,count,selected

    1.cookie中存在的商品id,redis中不存在 ,将cookie中的商品id,添加进来
    2.cookie中存在的商品id,redis中也存在 ,商品数量?我们以cookie为主
###################合并的数据############################

4.需要将合并的数据添加到redis
hash  {2:10,3:122,1:2,2:3}
set   {1,3}
5.删除cookie数据

1.获取cookie数据
2.获取redis数据 (只获取hash数据)
3.合并
4.需要将合并的数据添加到redis
5.删除cookie数据
"""
import base64
import pickle
from django_redis import get_redis_connection

def merge_cookie_to_redis(request,user,response):
    # 1.获取cookie数据
    cookie_str = request.COOKIES.get('cart')

    if cookie_str is not None:
        cookie_cart = pickle.loads(base64.b64decode(cookie_str))
        # {1:{count:5,selected:True},3:{count:5,selected:False}}

        # 2.获取redis数据 (只获取hash数据)
        redis_conn = get_redis_connection('cart')

        sku_count = redis_conn.hgetall('cart_%s'%user.id)
        # hash{b'1': b'3', b'2': b'5'}
        #对hash数据进行处理,转换类型
        redis_cart = {}
        for sku_id,count in sku_count.items():
            redis_cart[int(sku_id)] = int(count)
        #   选中的id我们用一个容器单独去记录
        selected_ids = []

        # 3.合并 需要对 cookie数据进行遍历
        # {1:{count:5,selected:True},3:{count:5,selected:False}}
        for sku_id,count_selected_dict in cookie_cart.items():
            # 判断 sku_id 是否在redis_cart
            # if sku_id in redis_cart:
            #     redis_cart[sku_id] = count_selected_dict['count']
            # else:
            #     redis_cart[sku_id] = count_selected_dict['count']
            redis_cart[sku_id] = count_selected_dict['count']

            #判断选中状态
            if count_selected_dict['selected']:
                selected_ids.append(sku_id)

        # 4.需要将合并的数据添加到redis
        #redis_cart是 最新的合并数据

        #这里使用user,而不是request.user是因为,当我们登录的时候没有用户,
        #所以不能使用request.user,认证完用户之后,再把user传递过来

        redis_conn.hmset('cart_%s'%user.id,redis_cart)

        #selected_ids 是新增的选中的id
        #sadd只能添加一个,所以对selected_ids进行解包
        if len(selected_ids) > 0:
            redis_conn.sadd('cart_selected_%s'%user.id,*selected_ids)

        # 5.删除cookie数据
        response.delete_cookie('cart')

        return response

    return response
